#include "teleinfo.h"
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

struct DynamicArray
{
    ElementType *array;             // 数组指针
    int capacity;                   // 数组容量
    int size;                       // 数组大小
    void (*FreePtr)(ElementType p); // 释放函数的函数指针
};
// struct TelephoneBook
// {
//     ElementType *array;             // 数组指针
//     char*name;                      //电话普名字
// };
// struct TelephoneInfo
// {   char*name;
//     int*telenumber;

// };

DArray*InitDArray(int capacity, void (*free)(void *))
{
    DArray *b = (DArray *)malloc(sizeof(DArray));
    if (b == NULL)
    {
        printf("申请DArray失败\n");
        return NULL;
    }
    b->size = 0;
    b->capacity = capacity;
    b->FreePtr = free;
    b->array = (ElementType *)malloc(sizeof(ElementType)*b->capacity);
    if (b->array == NULL)
    {
        printf("申请b->array失败\n");
        free(b);
        return NULL;
    }
    return b;
}


void FreeDArray(void *b)
{
    DArray *a = (DArray *)b;
    if (a)
    {
        if (a->FreePtr != NULL)
            {
                for (int i = 0; i < a->size; i++)
                {
                    a->FreePtr(a->array[i]);
                }
                free(a->array);
            }
    }
}

bool InsertTail(DArray*b,ElementType element)
{
   if (b->size>=b->capacity)
   {
        ElementType*newP=(ElementType*)realloc(b,b->capacity*2);
        if(newP==NULL)
        {
            printf("扩容失败\n");
            return false;
        }
        b->array=newP;
        b->capacity*=2;


   }
    b->array[b->size++]=element;
    //printf("chenggong");
}

void DeleteByIndex(DArray *b,int Index)
{
    
    if (Index<0||Index>=b->size)
    {
        printf("非法的位置\n");
        return;
    }
    if (b->FreePtr!=NULL)
    {
        b->FreePtr(b->array[Index]);
    }
    
    for (int i = Index; i < b->size; i++)
    {
        b->array[i]=b->array[i+1];
        
    }
    b->size--;
    

}

void DeleteByElement(DArray*ptr,ElementType element)
{
    for (int i = 0; i < ptr->size; i++)
    {
        if (ptr->array[i]==element)
        {
            DeleteByIndex(ptr,i);
            i--;
        }
        
    }
    
}


void PrintArray(DArray *ptr, void (*print)(void *))
{   
    for (int i = 0; i < ptr->size; i++)
    {
        print(ptr->array[i]);
    }
    

}

void *ReturnArray(DArray *ptr,int i)
{
    return ptr->array[i];
}

int ReturnSize(DArray *ptr)
{
    return ptr->size;
}

ElementType FindElement(DArray *a, ElementType element, bool (*find)(ElementType, ElementType))
{
    for (int i = 0; i < a->size; i++)
    {
        if (find(a->array[i], element) == true)
        {
            return a->array[i];
            printf("ture");
        }
    }
    return NULL;
}



